package gsw.common.aop.aspect;

import android.util.Log;
import android.widget.Toast;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

import gsw.common.aop.annotation.BehaviorTrace;

/**
 * 使用Aspect注解来定义切面
 */
@Aspect
public class BehaviorTraceAspect {
    /**
     * 使用Pointcut注解来定义切入点，指定需要进行切面处理的方法
     * Pointcut的参数必须使用指定格式execution(@注解全类名 注解所在的类 注解所在的方法)。*代表所有
     */
    @Pointcut("execution(@gsw.common.aop.annotation.BehaviorTrace * *(..))")
    public void methodAnnotatedWithBehaviorTrace() {
    }

    /**
     * 对切入点进行处理，可以使用三种方式注解(参数为上面使用Pointcut注解的方法)：
     * Before注解：自动在切入点之前运行,不能调用ProceedingJoinPoint.process();
     * After注解： 自动在切入点之后运行,不能调用ProceedingJoinPoint.process();
     * Around注解：必须调用ProceedingJoinPoint.process（）来执行切入点的方法，process（）之前的代码在切入点之前执行，process（）之后的代码在切入点之后执行;
     *
     * @param joinPoint 切入点
     */
    @Around("methodAnnotatedWithBehaviorTrace()")
    public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String className = methodSignature.getDeclaringType().getSimpleName();
        String methodName = methodSignature.getName();
        String funName = methodSignature.getMethod().getAnnotation(BehaviorTrace.class).value();

        //统计时间
        long begin = System.currentTimeMillis();
        //执行切入点的方法
        Object result = joinPoint.proceed();
        long duration = System.currentTimeMillis() - begin;
        Log.d("jett", String.format("功能：%s,%s类的%s方法执行了，用时%d ms", funName, className, methodName, duration));
        return result;
    }
}








